package com.cskaoyan.javase.oop1._13anonymous;

/**
 * 匿名（anonymous）或者佚名，指的是没有名字或者名字缺失。
 * 在Java当中，匿名对象指的就是没有名字的对象。
 * 或者，说的更清楚一点，就是：在创建对象时，就没有引用指向的对象，就是匿名对象！
 * 匿名对象的语法很简单，只需要在方法等位置中写下列语法：
 * new 类名(实参);
 * 以上语法就得到了一个匿名对象，从实质上看：
 * 该对象没有栈上的引用指向，没有所谓的"对象名"，是一个匿名对象。
 *
 * 匿名对象的使用
 * 一句话就是直接用
 * 一般来说有三个用途：
 * 1.在方法等局部位置，创建匿名对象，然后直接用，直接在后面"."使用对象
 * 2.匿名对象作为方法调用的实参
 * 3.匿名对象作为方法的返回值
 *
 * 总之，什么场景使用匿名对象呢？
 * 优点：
 * 使用匿名对象，代码简洁（相当于少写了一些代码）
 * 这是匿名对象最主要的优点。
 * 匿名对象在使用完毕后会立刻成为"垃圾"等待GC回收，从理论角度上来说，可以提升内存利用率。
 * 但是GC不具有即时性，并不是一个对象更早成为"垃圾"就会更好回收，这个优点仅是理论上的。
 *
 * 缺点：
 * 匿名对象由于没有引用指向，所以它是一次性的，用完后就无法再次使用了。
 * 当一个对象需要多次，反复，频繁被使用时
 * 如果创建多个匿名对象，那就得不偿失了。
 *
 * @since 14:33
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        /*
            匿名对象
            对于一个创建对象的语句
            比如
            Student s = new Student();
            触发类加载的是new对象，所以是右边
            所以
            即便是new创建匿名对象
            也是会类加载这个类的
         */
        new Student();

        // 直接使用
        new Student().study();
        System.out.println(new Student().age);

        test(new Student());
        Student s = test();
        s.study();
    }

    public static Student test(){
        return new Student();
    }

    public static void test(Student s){
        s.study();
    }
}

class Student {
    int age;
    static A a;

    public void study() {
        System.out.println("学习！");
    }
}
class A{}